#include "link.h"
Pliink create()
{
	Pliink p=malloc(sizeof(liink));
	if(NULL==p)
	{
		printf("创建头节点失败\n");
		return NULL;
	}
	p->len=0;
	p->next=NULL;
	return p;//返回头节点
}
//头插法
int front_insert(Pliink p,int e)
{
	if(NULL==p)
	{
		printf("单链表不存在，创建失败\n");
		return -1;
	}
	Pliink t=malloc(sizeof(liink));//申请新节点
	t->data=e;//数据赋值
	t->next=p->next;//连线右边
	p->next=t;//连线左边
	p->len++;
	printf("头插法插入完成\n");
	return 0;
}
//尾插法
int rear_insert(Pliink p,int e)
{
	if(NULL==p)
	{
		printf("单链表不存在，创建失败\n");
		return -1;
	}
	Pliink t=p;
	for(int i=0;i<p->len;i++)
	{
		t=t->next;
	}
	Pliink m=malloc(sizeof(liink));
	m->data=e;
	m->next=NULL;
	t->next=m;
	p->len++;
	printf("尾插法插入完成\n");
	return 0;
}
//任意位置插入
int anypos_insert(Pliink p,int n,int e)
{
	if(n<1||n>p->len+1||p==NULL)
	{
		printf("插入失败\n");
		return -1;
	}
	Pliink t=p;
	for(int i=1;i<n;i++)
	{
		t=t->next;
	}
	Pliink m=malloc(sizeof(liink));
	m->next=t->next;
	t->next=m;
	m->data=e;
	p->len++;
	printf("任意位置插入成功\n");
	return 0;
}
//任意位置删除
int anypos_delete(Pliink p,int n)
{
	if(p==NULL || n<1 || n>p->len)
	{
		printf("任意位置删除失败\n");
		return -1;
	}
	Pliink t=p;
	for(int i=1;i<n;i++)
	{
		t=t->next;
	}
	Pliink t1=t->next;
	t->next=t1->next;
	p->len--;
	free(t1);
	t1=NULL;
	printf("任意位置删除成功\n");
	return 0;
}
//头删
int front_delete(Pliink p)
{
	if(p==NULL || p->len<1)
	{
		printf("头删失败\n");
		return -1;
	}
	Pliink t=p->next;
	p->next=t->next;
	p->len--;
	free(t);
	t=NULL;
	printf("头删成功\n");
	return 1;
}
//尾删
int rear_delete(Pliink p)
{
	if(p==NULL ||p->len<1)
	{
		printf("尾删失败\n");
		return -1;
	}
	Pliink t=p;
	for(int i=0;i<p->len-1;i++)
		t=t->next;
	free(t->next);
	t->next=NULL;
	p->len--;
	return 0;
}
//按值删除
int valua_delete(Pliink p,int n)
{
	if(p==NULL || p->len<1)
	{
		printf("链表异常，按值删除失败\n");
		return -1;
	}
	Pliink t=p;
	int i;
	for(i=0;i<p->len;i++)
	{
		if(t->next->data==n)
			break;
		t=t->next;
	}
	if(i==p->len)
	{
		printf("该值不存在，删除失败\n");
		return -1;
	}
	Pliink t1=t->next;
	t->next=t1->next;
	free(t1);
	t1=NULL;
	p->len--;
	printf("查找到第%d个节点，删除成功\n",i+1);
	return 0;
}
//按值修改
int value_change(Pliink p,int e,int m)
{
	if(p==NULL || p->len<1)
	{
		printf("链表异常，按值修改失败\n");
		return -1;
	}
	Pliink t=p;
	int i;
	for(i=0;i<p->len;i++)
	{
		t=t->next;
		if(t->data==e)
			break;
	}
	if(i>=p->len)
	{
		printf("没有该值，修改失败\n");
		return -1;
	}
	t->data=m;
	printf("修改成功\n");
	return 0;
}
Pliink value_find(Pliink p,int e)
{
	if(p==NULL || p->len<1)
	{
		printf("链表异常，查找失败\n");
		return NULL;
	}
	Pliink t=p;
	int i;
	for(i=0;i<p->len;i++)
	{
		t=t->next;
		if(t->data==e)
			break;
	}
	if(i>=p->len)
	{
		printf("没有该值，查找失败\n");
		return NULL;
	}
	return t;
}
//链表逆序
int link_re1(Pliink p)
{
	if(p==NULL || p->len<1)
	{
		printf("链表错误,逆序失败\n");
		return -1;
	}
	Pliink t=p->next;	
	Pliink t1=t->next;
	for(int i=1;i<p->len;i++)
	{
		t1=t->next;
		t->next=t1->next;
		t1->next=p->next;
		p->next=t1;
	}
	t->next=NULL;
	return 0;
}
//排序
int popul_sort(Pliink p)
{
	if(p==NULL || p->len<1)
	{
		printf("链表异常，排序失败\n");
		return -1;
	}

	for(int i=0;i<p->len-1;i++)
	{
		Pliink t=p;
		for(int n=0;n<p->len-1-i;n++)
		{
			t=t->next;
			Pliink t1=t->next;
			if(t->data>t1->data)
			{
				int test =t->data;
				t->data=t1->data;
				t1->data=test;
			}
		}
	}
	printf("排序完成\n");
	return 0;
}
int Dudup(Pliink p)
{
	for(int i=0;i<p->len-1;i++)
	{
		Pliink t=p->next;
		Pliink t1=t->next;
		for(int n=i;n<p->len;n++)
		{
			if(t->data == t1->data)
			{
				t->next=t1->next;
				free(t1);
				t1=t->next;
				p->len--;
			}
			else
				t1=t1->next;
		}
	}
	printf("去重完成\n");
	return 0;
}
//链表释放
int link_destroy(Pliink p)
{
	if(p==NULL || p->len<0)
	{
		printf("链表异常，释放失败\n");
		return -1;
	}
	Pliink t=p;
	while(t!=NULL)
	{
		t=t->next;
		free(p);
		p=t;
	}
	printf("释放成功\n");
	return 0;
}
//遍历输出
void output_liink(Pliink p)
{
	Pliink t=p;
	printf("链表长度为%d\n",p->len);
	for(int i=0;i<p->len;i++)
	{
		t=t->next;
		printf("节点%d里的数据为%d\n",i+1,t->data);
	}
	printf("\n");
}

